package cn.highedu.coolsharkhub.service.impl;

import cn.highedu.coolsharkhub.mapper.CategoryMapper;
import cn.highedu.coolsharkhub.mapper.ProductMapper;
import cn.highedu.coolsharkhub.pojo.dto.ProductDTO;
import cn.highedu.coolsharkhub.pojo.entity.Category;
import cn.highedu.coolsharkhub.pojo.entity.Product;
import cn.highedu.coolsharkhub.pojo.vo.ProductHomepageVO;
import cn.highedu.coolsharkhub.pojo.vo.ProductManagementVO;
import cn.highedu.coolsharkhub.service.ProductService;
import cn.highedu.coolsharkhub.service.exception.EntityNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ProductServceImpl implements ProductService {

    private Logger logger = LoggerFactory.getLogger(ProductServceImpl.class);

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 首页中根据商品分类查询商品列表
     * @param categoryId 商品分类ID
     *                   不能为null 必须是已经存在的商品类别
     * @return 商品列表
     */
    @Override
    public List<ProductHomepageVO> findByCategoryIdForHomepage(Integer categoryId) {
        List<Product> products = productMapper.selectByCategoryId(categoryId);
        // 将Product转换为ProductHomepageVO, 首页不需要太多的商品信息
        return products.stream().map(product -> new ProductHomepageVO(
                product.id(),
                product.title(),
                product.image(),
                product.discount(),
                product.price(),
                product.sales(),
                product.categoryId(),
                product.views()
        )).collect(java.util.stream.Collectors.toList());
    }

    @Override
    public List<ProductManagementVO> findAllForManagement() {
        //查找所有分类，为了将分类ID转换为分类名
        List<Category> categories = categoryMapper.selectAll();
        // 为了提升查找性能，将分类信息转换为Map
        Map<Integer, String> categoryMap = categories.stream()
                .collect(Collectors.toMap(Category::id, Category::name));
        // 查找所有商品
        List<Product> products = productMapper.selectAll();
        // 将Product转换为ProductManagementVO, 管理界面需要的商品信息更多
        return products.stream().map(product -> new ProductManagementVO(
                product.id(),
                product.title(),
                product.image(),
                product.discount(),
                product.price(),
                product.sales(),
                product.stock(),
                product.categoryId(),
                product.views(),
                categoryMap.get(product.categoryId())
        )).collect(Collectors.toList());

    }

    @Override
    public void deleteById(Integer id) {
        if(productMapper.deleteById(id) != 1){
            throw new EntityNotFoundException("删除商品失败");
        }
    }

    @Override
    public void updateById(Integer id, ProductDTO productDTO) {
        logger.info("id: {}, productDTO: {}", id, productDTO);
        Product product = new Product(
                id,
                productDTO.title(),
                productDTO.image(),
                productDTO.discount(),
                productDTO.price(),
                productDTO.sales(),
                productDTO.stock(),
                productDTO.categoryId(),
                productDTO.views(),
                null,null);
        if (productMapper.updateById(product) != 1) {
            throw new EntityNotFoundException("更新商品失败");
        }
    }

    @Override
    public void add(ProductDTO productDTO) {
        Product product = new Product(null,
                productDTO.title(),
                productDTO.image(),
                productDTO.discount(),
                productDTO.price(),
                productDTO.sales(),
                productDTO.stock(),
                productDTO.categoryId(),
                productDTO.views(),
                null,null);
        if (productMapper.insert(product) != 1) {
            throw new EntityNotFoundException("添加商品失败");
        }
    }
}
